bf7ee5875c9175d317efeadc8b4d0a7510bf3309,src/org/jgroups/protocols/FC.java,FC,handleCredit,#Address#,290

Before Change


                    log.trace(sb.toString());
                }
                if(creditors.size() == 0) {
                    unblockSender(); // triggers sent.notifyAll()...
                }
            }
        }

After Change


    private void handleCredit(Address sender) {
        if(sender == null) return;
        StringBuffer sb=null;
        boolean unblock=false;

        synchronized(sent) {
            if(log.isTraceEnabled()) {
                Long old_credit=(Long)sent.get(sender);
                sb=new StringBuffer();
                sb.append("received credit from ").append(sender).append(", old credit was ").
                        append(old_credit).append(", new credits are ").append(max_credits).
                        append(".\nCreditors before are: ").append(printCreditors());
            }

            sent.put(sender, new Long(max_credits));
            if(creditors.size() > 0) {  // we are blocked because we expect credit from one or more members
                removeCreditor(sender);
                if(log.isTraceEnabled()) {
                    sb.append("\nCreditors after removal of ").append(sender).append(" are: ").append(printCreditors());
                    log.trace(sb.toString());
                }
                if(creditors.size() == 0) {
                    unblock=true;
                }
            }
        }
        if(unblock) // moved this outside of the 'sent' synchronized block
            unblockSender();
    }